//
// Description: 838. 堆排序
// Created by Loading on 2021/12/26.
//

#include <bits/stdc++.h>

using namespace std;

constexpr int N = 100010;

// 堆
int heap[N];
int n;

// 向下调整
void down(int i) {
    int min = i;
    if (i * 2 <= n && heap[i * 2] < heap[min]) {
        min = i * 2;
    }
    if (i * 2 + 1 <= n && heap[i * 2 + 1] < heap[min]) {
        min = i * 2 + 1;
    }
    if (min != i) { // 出现了交换
        swap(heap[i], heap[min]);
        down(min);
    }
}

int main() {
    int m;
    cin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        cin >> heap[i];
    }
    /* 构建堆，从中间节点开始，往根节点遍历，依次向下调整 */
    for (int i = n / 2; i >= 0; --i) {
        down(i);
    }
    while (m--) {
        cout << heap[1] << ' ';
        heap[1] = heap[n];
        --n;
        down(1);
    }

    return 0;
}